home *** CD-ROM | disk | FTP | other *** search
- (* A procedure "search" is to locate records with a given key
- in an ordered list. If the key is not present, then a new
- record is to be inserted so that the ordering of keys is
- maintained. Use a sentinel at the end of the list. *)
-
- MODULE list;
-
- FROM InOut IMPORT Write, WriteLn, WriteString, ReadCard, WriteCard;
- FROM Storage IMPORT ALLOCATE;
-
- TYPE ref = POINTER TO word;
- word = RECORD
- key: CARDINAL;
- count:CARDINAL;
- next: ref
- END;
-
- VAR k: CARDINAL;
- root,sentinel: ref;
-
- PROCEDURE search(x: CARDINAL; VAR root: ref);
- VAR w1,w2,w3: ref;
-
- BEGIN
- w2 := root;
- w1 := w2^.next;
- sentinel^.key := x;
- WHILE w1^.key < x DO
- w2 := w1;
- w1 := w2^.next
- END;
- IF (w1^.key = x) AND (w1 # sentinel) THEN
- INC(w1^.count);
- ELSE
- NEW(w3); (* insert w3 between w1 and w2 *)
- WITH w3^ DO
- key := x;
- count := 1;
- next := w1
- END;
- w2^.next := w3
- END
- END search;
-
- PROCEDURE printlist(w,z: ref);
- BEGIN
- WriteString(' Key Count');
- WriteLn;
- WHILE w # z DO
- WriteCard(w^.key,6);
- WriteCard(w^.count,6);
- w := w^.next; WriteLn
- END
- END printlist;
-
- BEGIN
- NEW(root); NEW(sentinel);
- root^.next := sentinel;
- LOOP
- WriteString(' Enter k> ');
- ReadCard(k); WriteLn;
- IF k = 0 THEN EXIT END;
- search(k,root);
- END;
- printlist(root^.next,sentinel)
- END list.
-